package br.com.drestranho.escola.managed;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;

import br.com.drestranho.escola.dao.DisciplinaDAO;
import br.com.drestranho.escola.dao.DisciplinaNomeDAO;
import br.com.drestranho.escola.dao.FuncionarioDAO;
import br.com.drestranho.escola.dao.TurmaDAO;
import br.com.drestranho.escola.entity.Disciplina;
import br.com.drestranho.escola.entity.DisciplinaNome;
import br.com.drestranho.escola.entity.Funcionario;
import br.com.drestranho.escola.entity.Turma;

// Manager da tela manterDisciplinaList.xhtml, que exibe a tabela com Disciplinas
// 
@ManagedBean  
@SessionScoped
public class ManterDisciplinaManager implements Serializable {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	@EJB
	DisciplinaDAO disciplinaDAO = new DisciplinaDAO();
	@EJB
	DisciplinaNomeDAO disciplinaNomeDAO = new DisciplinaNomeDAO();
	@EJB
	TurmaDAO turmaDAO = new TurmaDAO();
	@EJB
	FuncionarioDAO funcionarioDAO = new FuncionarioDAO();
	Disciplina disciplinaSelec;
	String turmaSelec;
	boolean modoInsert;
	List<Disciplina> disciplinas;
	List<Funcionario> professores;
	List<Turma> turmas;
	List<Integer> anos;
	Integer anoSelec;
	List<DisciplinaNome> disciplinasNomes;
	List<Integer> disciplinasNomesIds;
	List<String> disciplinasNomesNomes;
	List<String> turmasNomes;
	List<String> professoresNomes;
	DisciplinaNome disciplinaNomeSelec;
	String disciplinaNomeNomeSelec;
	String turmaNomeSelec;
	String professorNomeSelec;
	
	
	public List<String> getProfessoresNomes() {
		return professoresNomes;
	}

	public void setProfessoresNomes(List<String> professoresNomes) {
		this.professoresNomes = professoresNomes;
	}

	public String getProfessorNomeSelec() {
		return professorNomeSelec;
	}

	public void setProfessorNomeSelec(String professorNomeSelec) {
		this.professorNomeSelec = professorNomeSelec;
	}

	public String getTurmaNomeSelec() {
		return turmaNomeSelec;
	}

	public void setTurmaNomeSelec(String turmaNomeSelec) {
		this.turmaNomeSelec = turmaNomeSelec;
	}

	public List<String> getTurmasNomes() {
		return turmasNomes;
	}

	public void setTurmasNomes(List<String> turmasNomes) {
		this.turmasNomes = turmasNomes;
	}
	
	public List<Integer> getDisciplinasNomesIds() {
		return disciplinasNomesIds;
	}

	public void setDisciplinasNomesIds(List<Integer> disciplinasNomesIds) {
		this.disciplinasNomesIds = disciplinasNomesIds;
	}

	public List<String> getDisciplinasNomesNomes() {
		return disciplinasNomesNomes;
	}

	public void setDisciplinasNomesNomes(List<String> disciplinasNomesNomes) {
		this.disciplinasNomesNomes = disciplinasNomesNomes;
	}

	public String getDisciplinaNomeNomeSelec() {
		return disciplinaNomeNomeSelec;
	}

	public void setDisciplinaNomeNomeSelec(String disciplinaNomeNomeSelec) {
		this.disciplinaNomeNomeSelec = disciplinaNomeNomeSelec;
	}

	// chamado para popular a tabela nao so na criacao como tambem quando seu conteudo eh mudado
	@PostConstruct
	public void iniciarTabela() {
		disciplinas = null;
		disciplinas = (ArrayList<Disciplina>) disciplinaDAO.getBeans();
		Collections.sort(disciplinas, new ComparaDisciplina());
		setModoInsert(false);
		anos = disciplinaDAO.carregaAnos();
		disciplinasNomes = disciplinaNomeDAO.getBeans();
		disciplinasNomesIds = new ArrayList<Integer>();
		disciplinasNomesNomes = new ArrayList<String>();//disciplinaNomeDAO.getNomes();
		turmas = turmaDAO.getBeans();
		turmasNomes = new ArrayList<String>();
		professores = funcionarioDAO.getProfessores();//.getProfessores();
		professoresNomes = new ArrayList<String>();
		for (DisciplinaNome i : disciplinasNomes) {
			disciplinasNomesIds.add(i.getId());
			disciplinasNomesNomes.add(i.getNome());
		}
		for (Turma t : turmas) {
			turmasNomes.add(t.getSerie()+"ª "+t.getDigito());
		}
		for (Funcionario p : professores) {
			professoresNomes.add(p.getNome());
		}
			
	}
	
	public List<DisciplinaNome> getDisciplinasNomes() {
		return disciplinasNomes;
	}

	public void setDisciplinasNomes(List<DisciplinaNome> disciplinasNomes) {
		this.disciplinasNomes = disciplinasNomes;
	}

	public List<Integer> getAnos() {
		return anos;
	}

	public void setAnos(List<Integer> anos) {
		this.anos = anos;
	}

	public Integer getAnoSelec() {
		return anoSelec;
	}

	public void setAnoSelec(Integer anoSelec) {
		this.anoSelec = anoSelec;
	}


	public Disciplina getDisciplinaSelec() {
		return disciplinaSelec;
	}

	public void setDisciplinaSelec(Disciplina DisciplinaSelec) {
		this.disciplinaSelec = DisciplinaSelec;
	}

	public boolean getModoInsert() {
		return modoInsert;
	}

	public void setModoInsert(boolean modoInsert) {
		this.modoInsert = modoInsert;
	}

	public List<Disciplina> getDisciplinas() {
		return disciplinas;
	}
	
	public void setDisciplinas(List<Disciplina> Disciplinas) {
		this.disciplinas = Disciplinas;
	}
	
	public String cadastrar() {
		disciplinaSelec = new Disciplina();
		setModoInsert(true);
		return "manterDisciplinaForm";
	}
	
	public String editar() {
		setModoInsert(false);
		return "manterDisciplinaForm";
	}
	
	public String remover() {
		Disciplina f = disciplinaDAO.getBean(getDisciplinaSelec().getId());
		disciplinaSelec = null;
		disciplinaDAO.remover(f);
		iniciarTabela();
		return "";
	}
	
	public String salvar() {
		System.out.print("salvando "+disciplinaSelec.getId());
		System.out.print(professorNomeSelec+" "+professoresNomes.indexOf(professorNomeSelec));
		System.out.print(disciplinaNomeSelec+" "+disciplinasNomesNomes.indexOf(disciplinaNomeNomeSelec));
		System.out.print(turmaNomeSelec+" "+turmasNomes.indexOf(turmaNomeSelec));
		disciplinaSelec.setFuncionario( professores.get(professoresNomes.indexOf(professorNomeSelec)) );
		disciplinaSelec.setDisciplinaNome( disciplinasNomes.get(disciplinasNomesNomes.indexOf(disciplinaNomeNomeSelec)) );
		disciplinaSelec.setTurma(turmas.get(turmasNomes.indexOf(turmaNomeSelec)));
//		disciplinaSelec.getFuncionario().getNome()
		disciplinaDAO.salvar(getDisciplinaSelec());
		iniciarTabela();// nova entidade foi inserida; refazer a tabela
		return "manterDisciplinaList";
	}
	
	public String atualizar() {
		System.out.print("atual  "+disciplinaSelec.getId());
		disciplinaDAO.atualizar(getDisciplinaSelec());
		return "manterDisciplinaList";
	}
	
	
	// Classe interna que ordena os Disciplinas por nome. ano decrescente, serie crescente
	public class ComparaDisciplina implements Comparator<Disciplina> {
		@Override
		public int compare(Disciplina turm1, Disciplina turm2) {
			return 0;
		}
	}
	
}